/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package userservercontroller;

import autorization.ThreadTable;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
import repository.LongComparable;

/**
 * Сетевая таблица следит за пользователями которые авторизовались и ведут активную работу с сервером
 * @author Volk,Ustinov
 */
public class NetworkTable implements INetworkTable {
    private ConcurrentHashMap<LongComparable,LongComparable> mapID = new ConcurrentHashMap<LongComparable,LongComparable>();
    private ConcurrentHashMap<LongComparable,LongComparable> mapAKey = new ConcurrentHashMap<LongComparable,LongComparable>();
    private PingNetworkTable pingTable = new PingNetworkTable(this);
    /**
     * Конструктор по умолчанию, реализующий инициализацию сетевой таблицы
     */
    public NetworkTable() {
        mapID.clear();
        mapAKey.clear();
    }

    /**
     * Зарегистрировать авторизационный ключ в таблицу-----------
     * @param ID - идентификатор пользователя
     * @return авторизационный ключ
     */
    synchronized long addAuthorizationKey(long ID) {
        long magicKey = ID;
        mapID.put(new LongComparable(ID), new LongComparable(magicKey));
        mapAKey.put(new LongComparable(magicKey), new LongComparable(ID));
        pingTable.add(magicKey);
        return magicKey;
    }

  /**
   * Отклик пользователя
   * @param autorizationKey авторизационный ключ пользователя
   * @return true - счетчик успешно обновлён, false - ошибка при обновлениий счётчика, пользователь не авторизован
   */
   boolean ping(long autorizationKey){
     return pingTable.ping(autorizationKey);
   }

    /**
     * Проверка, авторизован ли пользователь
     * @param ID - идентификатор пользователя
     * @return true - авторизован, false - неавторизован
     */
    public boolean authorizedID(long ID) {
        return mapID.containsKey(ID);
    }

    /**
     * Проверка, авторизован ли пользователь
     * @param authorizationKey - авторизационный ключ
     * @return true - авторизован, false - неавторизован
     */
    public boolean authorized(long authorizationKey) {
        return mapAKey.containsKey(authorizationKey);
    }

   /**
   * Получить авторизационный ключ
   * @param ID - идентификатор пользователя
   * @return авторизационный ключ
   */
    public long getAuthorizationKey(long ID)
    {
        LongComparable lg = mapID.get(ID);
        if(lg == null) return -1;
        return lg.value;
    }

    /**
     * Получить идентификатор пользователя по авторизационному ключу
     * @param authorizationKey - авторизационный ключ
     * @return идентификатор пользователя
     */
    public synchronized long getID(long authorizationKey)
    {
        if (mapAKey.contains(new LongComparable(authorizationKey)))
            return mapAKey.get(new LongComparable(authorizationKey)).value;
        else
            return -1;
    }

    /**
     * Удалить авторизационный ключ из таблицы
     * @param autorizationKey - авторизационный ключ
     * @return true - удаление прошло успешно, false - такого авторизационного ключа в таблице нет
     */
    synchronized boolean deleteKey(long autorizationKey){
      LongComparable lg = mapAKey.get(new LongComparable(autorizationKey));
      if(lg == null) return false;
      LongComparable ID = new LongComparable(lg.value);
      mapAKey.remove(lg);
      mapID.remove(ID);
      pingTable.delete(autorizationKey);
      return true;
    }

    /**
     * Удалить всю инфорамцию из сетевой таблицы
     */
    synchronized void clear(){
      mapAKey.clear();
      mapID.clear();
      pingTable.clear();
    }
}

